package br.slic.services;

import java.security.NoSuchAlgorithmException;  
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.mail.Session;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import br.slic.eao.GenericEAO;
import br.slic.eao.UsuarioSistemaEAO;
import br.slic.entidade.Perfil;
import br.slic.entidade.PerfilFuncionalidade;
import br.slic.entidade.UsuarioSistema;
import br.slic.exception.EAOException;
import br.slic.exception.ServiceException;
import br.slic.exception.UsuarioInexistente;
import br.slic.services.interfaces.AdminServiceLocal;
import br.slic.util.DadosUtil;
import br.slic.util.EmailUtil;

@Stateless
public class AdminService implements AdminServiceLocal {

	@PersistenceContext(unitName=GenericEAO.UNIT_NAME)
	private EntityManager em;
	
	@Resource(name="mail/emailService")
	private Session sessaoEmail;

	@Override
	public void persisteUsuario(UsuarioSistema usuario) throws ServiceException {
		try {
			UsuarioSistemaEAO eao = new UsuarioSistemaEAO(em);
			UsuarioSistema usuarioAux = eao.obterUsuario(usuario.getLogin());
			
			if( usuarioAux != null && (DadosUtil.isEmpty(usuario.getId()) || usuarioAux.getId() != usuario.getId()) ) {
				throw new ServiceException("Login existente");
			}
			
			if ( DadosUtil.isEmpty(usuario.getId()) ) {
				String senha = DadosUtil.gerarSenha(usuario.getLogin());
				usuario.setSenha(senha);
				eao.persist(usuario);
				EmailUtil.enviar(sessaoEmail, usuario.getEmail(), "Envio Senha", "Texto...");
			} else {
				eao.saveOrUpdate(usuario);
			}
		} catch (EAOException e) {
			em.getTransaction().rollback();
			throw new ServiceException(e.getMessage());
		} catch (NoSuchAlgorithmException e) {
			em.getTransaction().rollback();
			throw new ServiceException(e.getMessage());
		}
	}

	@Override
	public UsuarioSistema obterUsuario(String login, String senha) throws ServiceException, UsuarioInexistente {
		UsuarioSistemaEAO eao = new UsuarioSistemaEAO(em);
		
		UsuarioSistema usuario;
		try {
			usuario = eao.obterUsuario(login, senha);
		} catch (EAOException e) {
			e.printStackTrace();
			throw new ServiceException(e);
		}
		
		return usuario;
	}

	@Override
	public void persistePerfil(Perfil perfil) throws ServiceException {
		try {
			GenericEAO<Perfil> eao = new GenericEAO<Perfil>(Perfil.class, em);
			
			List<PerfilFuncionalidade> perfilFuncionalidadesNovo = new ArrayList<PerfilFuncionalidade>();
			List<PerfilFuncionalidade> perfilFuncionalidades = perfil.getPerfisFuncionalidade();
			
			for (PerfilFuncionalidade pf : perfilFuncionalidades) {
				if(pf.getAtualizar().booleanValue() 
						|| pf.getConsultar().booleanValue() 
						|| pf.getExcluir().booleanValue()
						|| pf.getInserir().booleanValue()) {
					
					perfilFuncionalidadesNovo.add(pf);
				}
			}
			perfil.setPerfisFuncionalidade(perfilFuncionalidadesNovo);
			if ( DadosUtil.isEmpty(perfil.getId()) ) {
				eao.persist(perfil);				
			} else {
				eao.saveOrUpdate(perfil);
			}
		} catch (EAOException e) {
			em.getTransaction().rollback();
			throw new ServiceException(e.getMessage());
		}
	}

}